<?php

namespace Inscripcion\Controller\Service;

use Inscripcion\Controller\Service\GenericService;
use Inscripcion\Model\Entity\InscripcionDatos;
use Zend\Db\Adapter\Adapter;
use Componentes\Controller\VariablesGlobales;
use Componentes\Controller\UtilsArrayController;
use Inscripcion\Model\Dao\InscripcionDatosDAO;
use Componentes\Controller\Mensajes;
use Maestros\Controller\Service\AlumnoService;
use Transaccion\Controller\Service\DatosAcademicosService;
use Transaccion\Controller\Service\EspecialidadService;
use DateTime;
use DateTimeZone;
use Zend\Http\PhpEnvironment\Request;
use Transaccion\Controller\Service\OrganizacionSeccionService;

class InscripcionDatosService extends GenericService {

    /**
     * @var Zend\Db\Adapter\Adapter 
     */
    private $dbAdapter;
    private static $inscripcionDatosService;

    /**
     * @param \Zend\Db\Adapter\Adapter $dbAdapter
     */
    private function __construct(Adapter $dbAdapter) {
        $this->dbAdapter = $dbAdapter;
    }

    /**
     * 
     * @param type $adapter
     * @return Instancia de InscripcionDatosService
     * Patron singleton
     */
    public static function getInstance($adapter) {
        if (self::$inscripcionDatosService == null) {
            self::$inscripcionDatosService = new InscripcionDatosService($adapter);
        }
        return self::$inscripcionDatosService;
    }

    public function getInscripcionDatosDao() {
        return InscripcionDatosDAO::getInstance($this->dbAdapter);
    }

    /**
     * @param type $id
     * @return type
     */
    public function getInscripcionDatos($id) {
        $data = null;
        $success = false;
        $inscripcionDatos = $this->obtenerInscripcionDatosSegunId($id);
        if ($inscripcionDatos->getId() != null) {
            $data[0] = $inscripcionDatos->objectToArray();
            $success = true;
        }
        return UtilsArrayController::organizarOutput($success, $data, null);
    }

    public function validarAcceso($cedula) {
        $data = null;
        $success = false;
        $mensaje = null;
        $servicioAlumno = AlumnoService::getInstance($this->dbAdapter);
        $alumno = $servicioAlumno->obtenerAlumnoSegunCedula($cedula);
        if ($alumno->getId() != null) {
            $lapsoInscripcion = VariablesGlobales::$lapsoDeInscripcion;
            $inscripcionDatos = $this->obtenerInscripcionSegunIdAlumnoYLapsoInscripcion($alumno->getId(), $lapsoInscripcion);
            $servicioDatosAcademicos = DatosAcademicosService::getInstance($this->dbAdapter);
            if ($servicioDatosAcademicos->validoPorRetiroYSuspencion($alumno->getCedula())) {
                if ($inscripcionDatos->getId() != null) {
                    $servicioMetodologia = MetodologiaService::getInstance($this->dbAdapter);
                    $arrayMetodologia = $servicioMetodologia->obtenerArrayMetodologiaSegunId($inscripcionDatos->getMetodologia());
                    $fechaInicio = DateTime::createFromFormat('Y-m-d H:i:s', $inscripcionDatos->getFechaInicio());
                    $fechaFin = DateTime::createFromFormat('Y-m-d H:i:s', $inscripcionDatos->getFechaFin());
                    $fechaNow = new DateTime("now", new DateTimeZone('America/Caracas'));
//                    if (($fechaInicio < $fechaNow) && ($fechaNow < $fechaFin)) {
                    if (($inscripcionDatos->getMetodologia() != 3) && ($inscripcionDatos->getMetodologia() != 4)) {
                        $succes = true;
                        $mensaje = 'RETIRE SU PLANILLA DE INSCRIPCIÓN POR TAQUILLA 4 A PARTIR DEL 26/01/2015';
                        $data = null;
                    } else {
                        $succes = true;
                        $mensaje = 'CONSULTA TU METODOLOGIA DE INSCRIPCIÓN';
                        $data = null;
                    }
//                        if (($inscripcionDatos->getMetodologia() != 1) && ($inscripcionDatos->getMetodologia() != 2)) {
//                            $success = false;
//                            $data = $arrayMetodologia;
//                            $mensaje = Mensajes::msjMetodologiaInscripcion($data[0]['descripcion']) . Mensajes::msjSaltoLinea() . " Y  " . Mensajes::msjIntervaloDeFecha($fechaInicio->format('d-m-Y H:i:s'), $fechaFin->format('d-m-Y H:i:s'));
//                        } else {
//                            $success = true;
//                            $mensaje = 'ENTRADA AL SISTEMA EXITOSA';
//                            $data = $inscripcionDatos->objectToArray();
//                            unset($data['bauche']);
//                            unset($data['codigoSeguridad']);
//                            $data['_metodologia'] = $arrayMetodologia;
//                        }
//                    } else {
//                        $success = false;
//                        $data = $arrayMetodologia;
//                        if (($inscripcionDatos->getMetodologia() != 1) && ($inscripcionDatos->getMetodologia() != 2)) {
//                            $mensaje = Mensajes::msjMetodologiaInscripcion($data[0]['descripcion']) . Mensajes::msjSaltoLinea() . " Y  " . Mensajes::msjIntervaloDeFecha($fechaInicio->format('d-m-Y H:i:s'), $fechaFin->format('d-m-Y H:i:s'));
//                        } else {
//                            $mensaje = Mensajes::msjFechaInvalida($fechaInicio->format('d-m-Y H:i:s')) . Mensajes::msjSaltoLinea() . Mensajes::msjMetodologiaInscripcion($data[0]['descripcion']);
//                        }
//                    }
                } else {
                    $mensaje = Mensajes::msjSinInscripcionDatos();
                }
            } else {
                $mensaje = Mensajes::msjAccesoDenegadoPorSuspencionORetiro();
            }
        } else {
            $mensaje = Mensajes::msjSinRegistroEnLaTablaAlumno();
        }
        $output = UtilsArrayController::organizarOutput($success, $data, $mensaje);
        return $output;
    }

    public function getInscripcionDatosSegunIdAlumno($idAlumno) {
        $data = null;
        $success = false;
        $lapsoInscripcion = VariablesGlobales::$lapsoDeInscripcion;
        $inscripcionDatos = $this->obtenerInscripcionSegunIdAlumnoYLapsoInscripcion($idAlumno, $lapsoInscripcion);
        if ($inscripcionDatos->getId() != null) {
            $data[0] = $inscripcionDatos->objectToArray();
            $success = true;
        }
        return UtilsArrayController::organizarOutput($success, $data, null);
    }

//------Retornan los objetos-------

    public function obtenerInscripcionDatosSegunId($id) {
        $registros = $this->getInscripcionDatosDao()->getInscripcionDatos($id);
        $data = UtilsArrayController::llenarData($registros);
        $inscripcionDatos = new InscripcionDatos($data[0]);
        $inscripcionDatos->setFechaInicio($data[0]['hora_inicio']);
        $inscripcionDatos->setFechaFin($data[0]['hora_fin']);
        $inscripcionDatos->setCodigoSeguridad($data[0]['codigo_seguridad']);
        return $inscripcionDatos;
    }

    public function obtenerInscripcionSegunIdAlumnoYLapsoInscripcion($idAlumno, $lapsoInscripcion) {
        $result = $this->getInscripcionDatosDao()->getInscripcionDatossSegunIdAlumnoYLapso($idAlumno, $lapsoInscripcion);
        $data = UtilsArrayController::llenarData($result);
        value($data);
        $inscripcionDatos = new InscripcionDatos($data[0]);
        $inscripcionDatos->setFechaInicio($data[0]['hoa_inicio']);
        $inscripcionDatos->setFechaFin($data[0]['hoa_fin']);
        $inscripcionDatos->setCodigoSeguridad($data[0]['codigo_seguridad']);
        return $inscripcionDatos;
    }

//---------------------------------

    public function obtenerArrayInscripcionDatosSegunId($idAlumno) {
        $lapsoActual = VariablesGlobales::$lapsoDeInscripcion;
        $result = $this->getInscripcionDatosDao()->getInscripcionDatossSegunIdAlumnoYLapso($idAlumno, $lapsoActual);
        $data = UtilsArrayController::llenarData($result);
        return $data;
    }

    public function actualizarCodigoDeSeguridad($cedulaAlumno, $codigoSeguridad) {
        $servioAlumno = AlumnoService::getInstance($this->dbAdapter);
        $alumno = $servioAlumno->obtenerAlumnoSegunCedula($cedulaAlumno);
        $lapsoInscripcion = VariablesGlobales::$lapsoDeInscripcion;
        $result = $this->getInscripcionDatosDao()->updateCodigoSeguridadYEstado($alumno, $lapsoInscripcion, $codigoSeguridad);
        return $result;
    }

//------------------------MÉTODOLOGIA DE INSCRIPCIÓN --------------------------

    public function metodologiaInscripcion($cedula) {
        $data = null;
        $success = false;
        $mensaje = null;
        $servicioAlumno = AlumnoService::getInstance($this->dbAdapter);
        $alumno = $servicioAlumno->obtenerAlumnoSegunCedula($cedula);
        if ($alumno->getId() != null) {
            $lapsoInscripcion = VariablesGlobales::$lapsoDeInscripcion;
            $inscripcionDatos = $this->obtenerInscripcionSegunIdAlumnoYLapsoInscripcion($alumno->getId(), $lapsoInscripcion);
            $servicioDatosAcademicos = DatosAcademicosService::getInstance($this->dbAdapter);
            $datosacademicos = $servicioDatosAcademicos->obtenerDatosAcademicosActualSegunCedula($alumno->getCedula());
            $id = $datosacademicos->getSespeid();
            $servicioEspecialidad = EspecialidadService::getInstance($this->dbAdapter);
            $especialidadDescripcion = $servicioEspecialidad->obtenerEspecialidadSegunId($id);
            $especialidad = $especialidadDescripcion->getSespedescripcioncorta();
            if ($servicioDatosAcademicos->validoPorRetiroYSuspencion($alumno->getCedula())) {
                if ($inscripcionDatos->getId() != null) {
                    $servicioMetodologia = MetodologiaService::getInstance($this->dbAdapter);
                    $cedulaAlumno = $alumno->getCedula();
                    $nombreAlumno = $alumno->getNombre1();
                    $apellidosAlumno = $alumno->getApellido1();
                    $arrayMetodologia = $servicioMetodologia->obtenerArrayMetodologiaSegunId($inscripcionDatos->getMetodologia());
                    $fechaInicio = DateTime::createFromFormat('Y-m-d H:i:s', $inscripcionDatos->getFechaInicio());
                    $fechaFin = DateTime::createFromFormat('Y-m-d H:i:s', $inscripcionDatos->getFechaFin());
                    $success = true;
                    $data = $arrayMetodologia;
                    if (($inscripcionDatos->getMetodologia() != 1) && ($inscripcionDatos->getMetodologia() != 2) && ($inscripcionDatos->getMetodologia() != 4)) {
                        $mensaje = Mensajes::msjBienvenidoAlSistema() . Mensajes::msjSaltoLinea() . Mensajes::msjApellidos($apellidosAlumno, $nombreAlumno) . Mensajes::msjSaltoLinea() . Mensajes::msjEspecialidad($especialidad) . Mensajes::msjSaltoLinea() . Mensajes::msjMetodologiaInscripcion($data[0]['descripcion']) . Mensajes::msjSaltoLinea() . " Y  " . Mensajes::msjIntervaloDeFecha($fechaInicio, $fechaFin);
                    } else {
                        if ($inscripcionDatos->getMetodologia() == 4) {
                            $mensaje = Mensajes::msjEgresados();
                        } else {
                            $mensaje = Mensajes::msjBienvenidoAlSistema() . Mensajes::msjSaltoLinea() . Mensajes::msjApellidos($apellidosAlumno, $nombreAlumno) . Mensajes::msjSaltoLinea() . Mensajes::msjEspecialidad($especialidad) . Mensajes::msjSaltoLinea() . Mensajes::msjMetodologiaInscripcion($data[0]['descripcion']) . Mensajes::msjSaltoLinea() . Mensajes::msjFechaInvalida($fechaInicio) . Mensajes::msjSaltoLinea();
                        }
                    }
                } else {
                    $mensaje = Mensajes::msjSinInscripcionDatos();
                }
            } else {
                $mensaje = Mensajes::msjAccesoDenegadoPorSuspencionORetiro();
            }
        } else {
            $mensaje = Mensajes::msjSinRegistroEnLaTablaAlumno();
        }
        $output = UtilsArrayController::organizarOutput($success, $data, $mensaje);
        return $output;
    }

//----INSCRIPCION DATOS SEGUN FECHA SOLAMENTE pero solo los que van on line------
    public function obtenerArrayInscripcionDatosSegunFecha($fecha) {
        $lapsoInscripcion = VariablesGlobales::$lapsoDeInscripcion;
        $fechaInicio = DateTime::createFromFormat('d-m-Y', $fecha);
        $fechaInicio = $fechaInicio->format('Y-m-d');
        $result = $this->getInscripcionDatosDao()->getInscripcionDatosSegunFecha($fechaInicio, $lapsoInscripcion);
        $data = UtilsArrayController::llenarData($result);
        return $data;
    }

//----INSCRIPCION DATOS SEGUN FECHA SOLAMENTE pero solo los que van on line------
    public function obtenerArrayInscripcionDatosPresencialSegunLapso($lapso) {
        $result = $this->getInscripcionDatosDao()->getInscripcionDatosEstudiantesMetodologiaPresencial($lapso);
        $data = UtilsArrayController::llenarData($result);
        return $data;
    }

    public function inscribir($idDatosAcademicos, $idOrganizacionSeccion) {
        echo 'entro';
        echo $idDatosAcademicos;
        echo $idOrganizacionSeccion;
        $servicioOrganizacionSeccion = OrganizacionSeccionService::getInstance($this->dbAdapter);
        $cantidadDisponible = $servicioOrganizacionSeccion->obtenerCuposSeccionSegunOrganizacionSeccionId($id);
        var_dump($cantidadDisponible);
        if ($cantidadDisponible > 0) {
            $servicioOrganizacionSeccion->actualizarCuposSeccionSegunOrganizacionId($idOrganizacionSeccion, 2);
            
        }
        $result = $this->getInscripcionDatosDao()->getInscripcionDatosEstudiantesMetodologiaPresencial($lapso);
        $data = UtilsArrayController::llenarData($result);
        return $data;
    }

}
